/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

void pui_main(short mode) {
	short continuer = 0;
	char *contenu_titre = "PUISSANCE 4", prenom_2[100];

	clear();
	afficher_titre(contenu_titre);
	get_player_name(0, prenom);
	if(mode != 3) {
		get_player_name(2, prenom_2);
	}
	else {
		strcpy(prenom_2, "L'ordinateur");
	}

	while(continuer != 2) {
		short matrice[43] = {
			' ', // non utilisé
			' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ',
		};
		short colonne = 0, destination = 0, quitter = 1, gagnant[3] = {0, 0, 0} , tours = 0, temps_chute = 100, choix = 0, i;
		bool rejouer_J1 = true, rejouer_J2 = true, test_colonne = false;
		char message[100];
		memset(message, 0, sizeof(message));
		clear();
		afficher_titre(contenu_titre);
		while(quitter != 0 && tours != 42) {
			rejouer_J1 = true, rejouer_J2 = true;
			if(mode == 2 || mode == 4) {
				mvprintw(5, 1, "%s : %d ligne(s)", prenom, gagnant[1]);
				mvprintw(5, 105, "%s : %d ligne(s)", prenom_2, gagnant[2]);
			}

			while(rejouer_J1) {
				rejouer_J1 = false;
				colonne = pui_choisir_col(matrice, prenom, 1);

				if(colonne != 0) {
					test_colonne = false;

					for(i = 5; i != -1 && !test_colonne; i--) {
						if(matrice[colonne + (i*7)] == ' ') {
							test_colonne = true;
							destination = colonne + (i * 7);
						}
					}

					if(test_colonne) {
						temps_chute = 100;
						for(i = 0; destination != colonne + ((i - 1) * 7); i++) {
							matrice[colonne + (i*7)] = '1';
							pui_affichage(matrice, "", prenom, 0, 0);
							CSLP_Sleep(temps_chute);
							if(colonne + (i * 7) != destination) {
								matrice[colonne + (i*7)] = ' ';
							}
							temps_chute -= 15;
						}
					}
					else {
						rejouer_J1 = true;
						pui_affichage(matrice, "Il faut au moins un espace libre dans la colonne.", prenom, 0, 0);
						afficher_temps(37, 'm', 1, 2000);
						pui_affichage(matrice, "Veuillez rejouer !", prenom, 0, 0);
						afficher_temps(37, 'm', 1, 1000);
					}
				}
				else {
					clear();
					choix = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

					CSLP_ColorText(CT);

					if(choix == 1) {
						quitter = 0;
						rejouer_J1 = false;
						rejouer_J2 = false;
					}
					else {
						clear();
						afficher_titre(contenu_titre);
					}
				}
			}

			tours++;
			pui_verif_gagne(matrice, gagnant);
			if(mode == 2 || mode == 4) {
				mvprintw(5, 1, "%s : %d ligne(s)", prenom, gagnant[1]);
				mvprintw(5, 105, "%s : %d ligne(s)", prenom_2, gagnant[2]);
			}
			if(mode != 2 && mode != 4) {
				if(gagnant[1] != 0 || gagnant[2] != 0) {
					quitter = 0;
					rejouer_J2 = false;
				}
			}

			while(rejouer_J2) {
				rejouer_J2 = false;
				if(mode != 3 && mode != 4) {
					colonne = pui_choisir_col(matrice, prenom_2, 2);
				}
				else {
					colonne = pui_IA(matrice);
				}

				if(colonne != 0) {
					test_colonne = false;

					for(i = 5; i != -1 && !test_colonne; i--) {
						if(matrice[colonne + (i*7)] == ' ') {
							test_colonne = true;
							destination = colonne + (i * 7);
						}
					}

					if(test_colonne) {
						temps_chute = 100;
						for(i = 0; destination != colonne + ((i - 1) * 7); i++) {
							matrice[colonne + (i*7)] = '2';
							pui_affichage(matrice, "", prenom_2, 0, 0);
							CSLP_Sleep(temps_chute);
							if(colonne + (i * 7) != destination) {
								matrice[colonne + (i*7)] = ' ';
							}
							temps_chute -= 15;
						}
					}
					else {
						rejouer_J2 = true;
						pui_affichage(matrice, "Il faut au moins un espace libre dans la colonne.", prenom_2, 0, 0);
						afficher_temps(37, 'm', 1, 2000);
						pui_affichage(matrice, "Veuillez rejouer !", prenom_2, 0, 0);
						afficher_temps(37, 'm', 1, 1000);
					}
				}
				else {
					clear();
					choix = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

					CSLP_ColorText(CT);

					if(choix == 1) {
						quitter = 0;
						rejouer_J1 = false;
						rejouer_J2 = false;
					}
					else {
						clear();
						afficher_titre(contenu_titre);
					}
				}
			}
			tours++;

			pui_verif_gagne(matrice, gagnant);
			if(mode == 2 || mode == 4) {
				mvprintw(5, 1, "%s : %d ligne(s)", prenom, gagnant[1]);
				mvprintw(5, 105, "%s : %d ligne(s)", prenom_2, gagnant[2]);
			}

			if(mode != 2 && mode != 4) {
				if(gagnant[1] != 0 || gagnant[2] != 0) {
					quitter = 0;
				}
			}

		}

		clear();

		if(gagnant[1] != 0 || gagnant[2] != 0 || tours == 42) {
			afficher_titre(contenu_titre);

			if(gagnant[1] > gagnant[2]) {
				sprintf(message, "est le gagnant avec %d ligne(s) complette(s) contre %d pour %s !", gagnant[1], gagnant[2], prenom_2);
				pui_affichage(matrice, message, prenom, 0, 0);
			}
			else if(gagnant[1] < gagnant[2]) {
				sprintf(message, "est le gagnant avec %d ligne(s) complette(s) contre %d pour %s !", gagnant[2], gagnant[1], prenom);
				pui_affichage(matrice, message, prenom_2, 0, 0);
			}
			else {
				sprintf(message, "Partie nulle %d partout.", gagnant[1]);
				pui_affichage(matrice, message, "FINI !", 0, 0);
			}

			getch();
			clear();
		}

		continuer = afficher_menu_recommencer(contenu_titre);
		clear();
	}
}

void pui_verif_gagne(short matrice[43], short gagnant[3]) {
	short i, j, k;
	gagnant[1] = 0, gagnant[2] = 0;

	for(i = 0; i != 6; i++) {
		for(j = 0; j != 7; j++) {
			if(j <= 3) { //Vérif horizontal
				if(matrice[1 + j + (i*7)] == '1' && matrice[2 + j + (i*7)] == '1' && matrice[3 + j + (i*7)] == '1' && matrice[4 + j + (i*7)] == '1') {
					matrice[1 + j + (i*7)] = '4', matrice[2 + j + (i*7)] = '4', matrice[3 + j + (i*7)] = '4', matrice[4 + j + (i*7)] = '4';
					gagnant[1]++;
				}
				if(matrice[1 + j + (i*7)] == '2' && matrice[2 + j + (i*7)] == '2' && matrice[3 + j + (i*7)] == '2' && matrice[4 + j + (i*7)] == '2') {
					matrice[1 + j + (i*7)] = '5', matrice[2 + j + (i*7)] = '5', matrice[3 + j + (i*7)] = '5', matrice[4 + j + (i*7)] = '5';
					gagnant[2]++;
				}
			}
		}
	}

	for(k = 1; k != 43; k++) {
		if(matrice[k] == '4') {
			matrice[k] = '1';
		}
		if(matrice[k] == '5') {
			matrice[k] = '2';
		}
	}

	for(i = 0; i != 6; i++) {
		for(j = 0; j != 7; j++) {
			if(i <= 2) { // Verif verticale
				if(matrice[1 + j + (i*7)] == '1' && matrice[8 + j + (i*7)] == '1' && matrice[15 + j + (i*7)] == '1' && matrice[22 + j + (i*7)] == '1') {
					matrice[1 + j + (i*7)] = '4', matrice[8 + j + (i*7)] = '4', matrice[15 + j + (i*7)] = '4', matrice[22 + j + (i*7)] = '4';
					gagnant[1]++;
				}
				if(matrice[1 + j + (i*7)] == '2' && matrice[8 + j + (i*7)] == '2' && matrice[15 + j + (i*7)] == '2' && matrice[22 + j + (i*7)] == '2') {
					matrice[1 + j + (i*7)] = '5', matrice[8 + j + (i*7)] = '5', matrice[15 + j + (i*7)] = '5', matrice[22 + j + (i*7)] = '5';
					gagnant[2]++;
				}
			}
		}
	}

	for(k = 1; k != 43; k++) {
		if(matrice[k] == '4') {
			matrice[k] = '1';
		}
		if(matrice[k] == '5') {
			matrice[k] = '2';
		}
	}

	for(i = 0; i != 6; i++) {
		for(j = 0; j != 7; j++) {
			if(i <= 2 && j <= 3) { // Verif diagonales x2 : \ et /
				if(matrice[1 + j + (i*7)] == '1' && matrice[9 + j + (i*7)] == '1' && matrice[17 + j + (i*7)] == '1' && matrice[25 + j + (i*7)] == '1') {
					matrice[1 + j + (i*7)] = '4', matrice[9 + j + (i*7)] = '4', matrice[17 + j + (i*7)] = '4', matrice[25 + j + (i*7)] = '4';
					gagnant[1]++;
				}
				if(matrice[1 + j + (i*7)] == '2' && matrice[9 + j + (i*7)] == '2' && matrice[17 + j + (i*7)] == '2' && matrice[25 + j + (i*7)] == '2') {
					matrice[1 + j + (i*7)] = '5', matrice[9 + j + (i*7)] = '5', matrice[17 + j + (i*7)] = '5', matrice[25 + j + (i*7)] = '5';
					gagnant[2]++;
				}
			}
		}
	}

	for(k = 1; k != 43; k++) {
		if(matrice[k] == '4') {
			matrice[k] = '1';
		}
		if(matrice[k] == '5') {
			matrice[k] = '2';
		}
	}

	for(i = 0; i != 6; i++) {
		for(j = 0; j != 7; j++) {
			if(i <= 2 && j <= 3) { // Verif diagonales x2 : \ et /
				if(matrice[4 + j + (i*7)] == '1' && matrice[10 + j + (i*7)] == '1' && matrice[16 + j + (i*7)] == '1' && matrice[22 + j + (i*7)] == '1') {
					matrice[4 + j + (i*7)] = '4', matrice[10 + j + (i*7)] = '4', matrice[16 + j + (i*7)] = '4', matrice[22 + j + (i*7)] = '4';
					gagnant[1]++;
				}
				if(matrice[4 + j + (i*7)] == '2' && matrice[10 + j + (i*7)] == '2' && matrice[16 + j + (i*7)] == '2' && matrice[22 + j + (i*7)] == '2') {
					matrice[4 + j + (i*7)] = '5', matrice[10 + j + (i*7)] = '5', matrice[16 + j + (i*7)] = '5', matrice[22 + j + (i*7)] = '5';
					gagnant[2]++;
				}
			}
		}
	}

	for(k = 1; k != 43; k++) {
		if(matrice[k] == '4') {
			matrice[k] = '1';
		}
		if(matrice[k] == '5') {
			matrice[k] = '2';
		}
	}
}

short pui_choisir_col(short matrice[43], const char *nom_joueur, short joueur) {
	short colonne = 4, save_colonne = 0, k = '0';

	while(k != '\r' && k != '\n' && k != '\b') {
		pui_affichage(matrice, "Veuillez choisir la colonne où placer le jeton.", nom_joueur, colonne, joueur);
		k = getch();

		if(colonne == 0 && k != KEY_RETURN) {
			colonne = save_colonne;
		}

		if(k == touche_gauche) {
			if(colonne > 1) {
				colonne--;
			}
		}

		if(k == touche_droite) {
			if(colonne < 7) {
				colonne++;
			}
		}

		if(k == '0') {
			save_colonne = colonne;
			colonne = 0;
		}
	}

	return colonne;
}
